package com.jt.demo01.proxy;

import javax.xml.transform.Result;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JDKProxy {
    /**
     *获取代理对象
     * 1.ClassLoader loader 类加载器 读取真实的类数据
     * 2.Class<?>[] interfaces, 要求传递接口信息
     * 注意事项:JDK代理必须要求被代理者有接口(本身就是接口),要么实现接口(实现类)
     * 3.InvocationHandler h  当代理对象执行方法时执行*/
    public static Object getProxy(Object target){
        //1.获取类加载器
        ClassLoader classLoader = target.getClass().getClassLoader();
        //2.获取接口
        Class[] interfaces = target.getClass().getInterfaces();

        //代理对象执行方法时,才会执行业务的扩展功能
        return Proxy.newProxyInstance(classLoader,interfaces ,getInvocationHandler(target) );
    }
    //代理对象执行方法执行方法时调用
    private static InvocationHandler getInvocationHandler(Object target) {
        //这些代码都是写死的
        return new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("事物开始");
                //执行真实的业务方法,并且获取返回值结果  固定写法
                Object result = method.invoke(target, args);
                System.out.println("事物提交");
                return result;
            }
        };
    }

}
